쿠버네티스 용어집
A. 기본 개념
Kubernetes (쿠버네티스)
- 정의: 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오케스트레이션 플랫폼
- 별칭: K8s (K와 s 사이에 8글자)
- 개발: Google이 개발, 현재 CNCF에서 관리
클러스터 (Cluster)
- 정의: 쿠버네티스가 관리하는 노드들의 집합
- 구성: Control Plane(마스터) + Worker Nodes
노드 (Node)
- 정의: 클러스터를 구성하는 개별 서버(물리/가상 머신)
- 종류:
- 마스터 노드: Control Plane 컴포넌트 실행
- 워커 노드: 실제 워크로드(파드) 실행
파드 (Pod)
- 정의: 쿠버네티스에서 배포 가능한 가장 작은 단위
- 특징: 하나 이상의 컨테이너를 포함, 네트워크/스토리지 공유
B. Control Plane 컴포넌트
API 서버 (kube-apiserver)
- 정의: 쿠버네티스 API를 노출하는 컴포넌트
- 역할: 모든 요청의 진입점, 인증/인가 처리
etcd
- 정의: 클러스터의 모든 상태 데이터를 저장하는 분산 키-값 저장소
- 저장 데이터: 파드, 서비스, ConfigMap, Secret 등
스케줄러 (kube-scheduler)
- 정의: 새로 생성된 파드를 어떤 노드에 배치할지 결정하는 컴포넌트
- 고려사항: 리소스 요구사항, 어피니티, 테인트/톨러레이션
컨트롤러 매니저 (kube-controller-manager)
- 정의: 다양한 컨트롤러를 실행하는 컴포넌트
- 컨트롤러 종류: Deployment, ReplicaSet, Node, Job 컨트롤러 등
C. 워커 노드 컴포넌트
kubelet
- 정의: 각 노드에서 실행되는 에이전트
- 역할: 파드의 컨테이너가 실행되도록 관리, CRI 런타임과 통신
kube-proxy
- 정의: 각 노드의 네트워크 프록시
- 역할: Service의 네트워크 규칙 관리, 로드 밸런싱
컨테이너 런타임 (Container Runtime)
- 정의: 실제로 컨테이너를 실행하는 소프트웨어
- 예시: containerd, CRI-O
D. 워크로드 리소스
Deployment (디플로이먼트)
- 정의: 상태 없는(Stateless) 애플리케이션을 선언적으로 관리하는 리소스
- 기능: 롤링 업데이트, 롤백, 스케일링
ReplicaSet (레플리카셋)
- 정의: 지정된 수의 파드 복제본을 유지하는 리소스
- 관계: Deployment가 ReplicaSet을 생성/관리
StatefulSet (스테이트풀셋)
- 정의: 상태 있는(Stateful) 애플리케이션을 관리하는 리소스
- 특징:
- 고정된 네트워크 ID (pod-0, pod-1, ...)
- 순차적 시작/종료
- 안정적인 영구 스토리지
DaemonSet (데몬셋)
- 정의: 모든(또는 특정) 노드에 파드를 하나씩 실행하는 리소스
- 용도: 로그 수집기, 모니터링 에이전트, 네트워크 플러그인
Job (잡)
- 정의: 완료될 때까지 실행되는 일회성 작업을 관리하는 리소스
- 파라미터:
- completions: 성공해야 할 파드 수
- parallelism: 동시 실행 파드 수
- backoffLimit: 재시도 횟수
CronJob (크론잡)
- 정의: 스케줄에 따라 주기적으로 Job을 생성하는 리소스
- 크론 표현식:
분 시 일 월 요일 (예: 0 3 * * * = 매일 03:00)
E. 서비스와 네트워킹
Service (서비스)
- 정의: 파드 집합에 대한 안정적인 네트워크 엔드포인트
- 타입:
- ClusterIP: 클러스터 내부에서만 접근 (기본값)
- NodePort: 각 노드의 포트로 외부 노출
- LoadBalancer: 클라우드 로드밸런서 사용
- ExternalName: 외부 DNS 이름으로 매핑
헤드리스 서비스 (Headless Service)
- 정의: ClusterIP가 None인 서비스
- 용도: 각 파드의 개별 DNS 레코드 필요 시 (StatefulSet과 함께 사용)
Ingress (인그레스)
- 정의: 클러스터 외부에서 내부 서비스로 HTTP/HTTPS 라우팅을 관리하는 리소스
- 기능: 호스트/경로 기반 라우팅, TLS 종료
CNI (Container Network Interface)
- 정의: 컨테이너 네트워크 설정을 위한 표준 인터페이스
- 플러그인 예시: Calico, Cilium, Flannel, Weave
F. 설정과 시크릿
ConfigMap (컨피그맵)
- 정의: 애플리케이션 설정 정보를 키-값 쌍으로 저장하는 리소스
- 사용 방법: 환경 변수로 주입, 볼륨으로 마운트
Secret (시크릿)
환경 변수 (Environment Variable)
- 정의: 컨테이너에 주입되는 설정 값
- 소스: 직접 지정, ConfigMap, Secret
G. 스토리지
Volume (볼륨)
- 정의: 컨테이너에 연결되는 저장 공간
- 종류: emptyDir, hostPath, PersistentVolumeClaim 등
PersistentVolume (PV)
- 정의: 클러스터의 스토리지 리소스를 추상화한 객체
- 특징: 파드와 독립적인 수명
PersistentVolumeClaim (PVC)
- 정의: 사용자가 스토리지를 요청하는 선언
- 관계: PVC가 조건에 맞는 PV와 바인딩됨
StorageClass (스토리지클래스)
- 정의: 동적 프로비저닝 정책을 정의하는 리소스
- 파라미터: provisioner, parameters, reclaimPolicy
emptyDir
- 정의: 파드와 동일한 수명을 가지는 임시 볼륨
- 용도: 파드 내 컨테이너 간 데이터 공유
AccessModes (접근 모드)
- RWO (ReadWriteOnce): 단일 노드에서 읽기/쓰기
- ROX (ReadOnlyMany): 여러 노드에서 읽기 전용
- RWX (ReadWriteMany): 여러 노드에서 읽기/쓰기
동적 프로비저닝 (Dynamic Provisioning)
- 정의: PVC 생성 시 자동으로 스토리지와 PV를 생성하는 기능
- 요구사항: StorageClass 설정 필요
CSI (Container Storage Interface)
- 정의: 컨테이너 오케스트레이션과 스토리지 시스템 간의 표준 인터페이스
- 드라이버 예시: AWS EBS CSI, GCP PD CSI, Azure Disk CSI
H. 스케일링과 업데이트
스케일링 (Scaling)
- 스케일 아웃: 파드 수를 늘려 처리량 증가
- 스케일 인: 파드 수를 줄여 리소스 절약
HPA (Horizontal Pod Autoscaler)
- 정의: CPU/메모리 사용량 기반으로 파드 수를 자동 조절하는 리소스
- 동작: 메트릭 기반 스케일 아웃/인
VPA (Vertical Pod Autoscaler)
- 정의: 파드의 리소스 요청/제한을 자동 조절하는 리소스
- 동작: 개별 파드의 CPU/메모리 조정
롤링 업데이트 (Rolling Update)
- 정의: 파드를 점진적으로 새 버전으로 교체하는 배포 전략
- 장점: 다운타임 없는 무중단 배포
롤백 (Rollback)
- 정의: 이전 버전으로 되돌리는 작업
- 명령어:
kubectl rollout undo
I. 스케줄링 관련
nodeSelector
- 정의: 특정 레이블을 가진 노드에만 파드를 스케줄링하는 설정
Affinity (어피니티)
- 정의: 파드를 특정 노드나 다른 파드 근처에 배치하도록 하는 규칙
- 종류: nodeAffinity, podAffinity, podAntiAffinity
Taint (테인트)
- 정의: 노드에 설정하여 특정 파드만 스케줄링 허용하도록 하는 표시
- 효과: NoSchedule, PreferNoSchedule, NoExecute
Toleration (톨러레이션)
- 정의: 파드에 설정하여 특정 테인트를 가진 노드에 스케줄링 허용
J. 메타데이터
Label (레이블)
- 정의: 리소스를 식별하고 그룹화하는 키-값 쌍
- 용도: 셀렉터로 리소스 선택, 서비스-파드 연결
Annotation (어노테이션)
- 정의: 리소스에 첨부하는 메타데이터
- 용도: 도구/라이브러리에 정보 전달, 설명 기록
Selector (셀렉터)
- 정의: 레이블을 기준으로 리소스를 선택하는 쿼리
- 종류: 일치 기반(=), 집합 기반(in, notin)
Namespace (네임스페이스)
- 정의: 클러스터 내 리소스를 논리적으로 분리하는 단위
- 기본값: default, kube-system, kube-public
K. 매니페스트 관련
매니페스트 (Manifest)
- 정의: 쿠버네티스 리소스를 정의하는 YAML/JSON 파일
- 필수 필드: apiVersion, kind, metadata, spec
apiVersion
kind
- 정의: 생성할 리소스의 타입
- 예시: Pod, Deployment, Service, ConfigMap
- 정의: 리소스의 메타 정보
- 포함: name, namespace, labels, annotations
spec
- 정의: 리소스의 원하는 상태(desired state)를 정의
- 내용: 리소스 타입에 따라 다름
L. 선언적 관리
선언적 관리 (Declarative Management)
- 정의: "원하는 상태"를 선언하면 시스템이 자동으로 맞추는 방식
- 장점: GitOps, IaC(Infrastructure as Code) 가능
명령적 관리 (Imperative Management)
- 정의: 명령어로 직접 작업을 지시하는 방식
- 예시: kubectl run, kubectl create
컨트롤러 (Controller)
- 정의: 리소스의 현재 상태를 원하는 상태로 맞추는 제어 루프
- 동작: Watch → Diff → Reconcile
Reconciliation Loop (조정 루프)
- 정의: 현재 상태와 원하는 상태의 차이를 지속적으로 확인하고 조정하는 과정
M. 멀티 컨테이너 패턴
사이드카 패턴 (Sidecar)
- 정의: 메인 컨테이너를 보조하는 컨테이너를 함께 배치
- 용도: 로깅, 모니터링, 프록시
앰배서더 패턴 (Ambassador)
- 정의: 외부 서비스와의 통신을 중계하는 컨테이너
- 용도: 연결 풀링, 서비스 디스커버리
어댑터 패턴 (Adapter)
- 정의: 메인 컨테이너의 출력을 변환하는 컨테이너
- 용도: 로그 포맷 변환, 메트릭 변환
N. 확장 기능
CRD (Custom Resource Definition)
- 정의: 사용자 정의 리소스를 정의하는 쿠버네티스 리소스
- 용도: 쿠버네티스 API 확장
Operator 패턴
- 정의: CRD + 커스텀 컨트롤러로 복잡한 애플리케이션을 자동 관리
- 예시: Prometheus Operator, MySQL Operator
O. 도구
kubectl
- 정의: 쿠버네티스 클러스터를 관리하는 CLI 도구
- 주요 명령어: apply, get, describe, logs, exec, delete
kubeconfig
- 정의: kubectl이 클러스터에 연결하기 위한 설정 파일
- 위치: ~/.kube/config
- 내용: clusters, users, contexts
컨텍스트 (Context)
- 정의: 클러스터, 사용자, 네임스페이스의 조합
- 명령어: kubectl config use-context
Minikube
- 정의: 로컬에서 단일 노드 쿠버네티스 클러스터를 실행하는 도구
- 용도: 학습, 개발, 테스트
P. 관리형 쿠버네티스
EKS (Elastic Kubernetes Service)
GKE (Google Kubernetes Engine)
- 정의: Google Cloud의 관리형 쿠버네티스 서비스
AKS (Azure Kubernetes Service)
- 정의: Microsoft Azure의 관리형 쿠버네티스 서비스
아키텍처 다이어그램
[쿠버네티스 클러스터]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Control Plane (마스터)]
│
├─ kube-apiserver ← kubectl, 사용자 요청 진입점
├─ etcd ← 클러스터 상태 저장
├─ kube-scheduler ← 파드 배치 결정
└─ kube-controller-manager
├─ Deployment Controller
├─ ReplicaSet Controller
├─ StatefulSet Controller
├─ DaemonSet Controller
└─ Job Controller
[Worker Node 1] [Worker Node 2] [Worker Node N]
│ │ │
├─ kubelet ├─ kubelet ├─ kubelet
├─ kube-proxy ├─ kube-proxy ├─ kube-proxy
├─ containerd ├─ containerd ├─ containerd
│ │ │
└─ [Pods] └─ [Pods] └─ [Pods]
리소스 관계도
[Deployment]
↓ 생성/관리
[ReplicaSet]
↓ 복제본 유지
[Pod] ─────────────────────────────┐
↓ 트래픽 라우팅 │
[Service] ←─ [Ingress] (외부) │
│
[ConfigMap] ──→ 환경변수/파일 ─────┤
[Secret] ──────→ 민감정보 ─────────┤
[PVC] ─────────→ 스토리지 ─────────┘
↓ 바인딩
[PV] ← [StorageClass] (동적 프로비저닝)
핵심 정리
| 리소스 |
용도 |
특징 |
| Deployment |
Stateless 앱 |
롤링 업데이트, 스케일링 |
| StatefulSet |
Stateful 앱 |
고정 ID, 순차 관리 |
| DaemonSet |
노드당 1개 파드 |
로그/모니터링 에이전트 |
| Job |
일회성 작업 |
완료 시 종료 |
| CronJob |
주기적 작업 |
스케줄 기반 |
| Service |
네트워크 엔드포인트 |
로드밸런싱 |
| ConfigMap |
설정 정보 |
평문 저장 |
| Secret |
민감 정보 |
Base64 인코딩 |
| PV/PVC |
영구 스토리지 |
파드와 독립 수명 |